/**
 * Created by ME-CODE on 2015/11/20.
 */
//TODO bind方法的简单例子
function modules() {
    console.log(this);
    console.log(this.a);
    console.log(this.b);
}
//绑定之前
console.log("bind绑定之前");
modules();
//绑定之后
console.log("bind绑定之后");
var m = modules.bind({a: 1, b: 2});
m();
//使用new 创建对象
console.log("使用new 创建对象");
new m();

//TODO javascript 闭包
console.log("===========================闭包开始===========================")
//2.1闭包的理解

//2.2闭包的作用 闭包封装属性

//2.3 for循环闭包
for (var i = 1; i < 4; i++) {

}
//TODO javascript 作用域 全局  函数  eval 作用域链
console.log("===========================作用域开始===========================")

var a = 10;//全局
(function () {
    var b = 10; //函数
})();
//console.log(b);//拿不到
eval('a=1');//eavl

//利用函数作用域 封装
(function () {
    var a, b;
})();
// ! 和 + //为了把函数变成函数表达式 不是函数声明而不被前置
!function () {

}
//TODO 全局执行上下文(浏览器)
console.log("===========================全局执行上下文(浏览器) window===========================")

//TODO 变量初始化阶段
console.log("===========================变量初始化阶段===========================")
//变量初始化阶段
//VO 按照如下顺序填充
//1.函数参数（若未传入，初始化该参数值为undefined）
//2.函数声明（若发生命名冲突，会覆盖掉）function foo(x,y,z){function x(){};console.log(x);} foo(100);==>function x(){}
//3.变量声明（初始化变量值为undefined，若发生命名冲突，会忽略）function foo(x,y,z)(){function func(){};var func;console.log(func)} //结果 function func(){}
//例子
function test(a, b) {
    var c = 10;

    function d() {
    };
    var e = function _e() {
    };
    (function () {
    });//函数表达式
    b = 20;
}
test(10);
//AO(test) ={
//    a:10,//函数值初始
//    b:undefined,
//    c:undefined,//先声明 后赋值
//    d:<ref to func "d">
//    e:undefined
//} 函数表达式不会影响VO
//TODO 代码执行阶段
console.log("===========================代码执行阶段===========================")
alert(x);//function x(){}
var x = 10;
alert(x)//10
x = 20;
function x() {
}
alert(x); //20
if (a) {
    a = 1;
} else {
    var b = true;
}
alert(a); //1
alert(b); //undefined
